/**
 * Project: topdt-jbpm
 * Copyright 2013  Top Digital Technology  Co. Ltd.
 * All right reserved.
 */
package com.topdt.jbpm.identity;

import java.util.List;

import com.topdt.jbpm.dictionary.Dictionary;
import com.topdt.jbpm.dictionary.DictionaryValue;
import com.topdt.jbpm.form.query.Option;

/**
 * 建立日期 : 2013-5-8 上午11:09:11<br>
 * 作者 : balance<br>
 * 模块 : <br>
 * 描述 : <br>
 * 修改历史: 序号 日期 修改人 修改原因 <br>
 * 1 <br>
 * 2 <br>
 */
public interface IdentityService {

	/**
	 * 取角色下的人员
	 *
	 * @param roleId
	 * @return
	 */
	public List<User> getUsersByRole(String... roleId);

	/**
	 * 取部门下的人员
	 *
	 * @param depId
	 * @return
	 */
	public List<User> getUsersByDep(String... depId);

	/**
	 * 取得部门下某个角色的人员
	 *
	 * @param roleId
	 * @param depId
	 * @return
	 */
	public List<User> getUsersByRoleAndDep(String roleId, String depId);

	/**
	 * 取得给定部门下给定角色的人员集合
	 *
	 * @param roleIds
	 * @param depIds
	 * @return
	 */
	public List<User> getUsersByRoleAndDep(String[] roleIds, String[] depIds);

	/**
	 * 取得给定部门类型下给定角色的人员集合
	 *
	 * @param roleIds
	 * @param depTIds
	 * @return
	 */
	public List<User> getUsersByRoleAndDepType(String[] roleIds, String[] depTIds);

	/**
	 * 取人员的角色
	 *
	 * @param userId
	 * @return
	 */
	public List<Role> getRolesOfUser(String userId);

	/**
	 * 取人员所在的部门，包括兼职部门
	 *
	 * @param userId
	 * @return
	 */
	public List<Department> getDepsOfUser(String userId);

	/**
	 * 取人员所在部门
	 *
	 * @param userId
	 * @return
	 */
	public Department getMajorDepOfUser(String userId);

	/**
	 * 取人员的上level级部门经理，level=0时为本部门经理
	 *
	 * @param userId
	 * @return
	 */
	public List<? extends User> getManagersByUser(String userId, String level);

	public List<? extends User> getManagersByDep(String depId, String level);

	/**
	 * 取人员的上级
	 *
	 * @param userId
	 * @return
	 */
	public List<User> getSuperiors(String userId);

	/**
	 * 取人员的下级
	 *
	 * @param userId
	 * @return
	 */
	public List<User> getJuniors(String userId);

	/**
	 * 根据用户Id取得人员
	 *
	 * @param userId
	 * @return
	 */
	public User getUserById(String userId);

	/**
	 * 根据用户id数组取得人员集合
	 *
	 * @author zhangyong
	 * @date 2014-11-16 上午10:39:08
	 * @param userIds
	 * @return
	 */
	public List<User> getUsersByUserIds(String[] userIds);

	/**
	 * 根据用户Id取得人员 包括删除的人员 建立日期 : Sep 12, 2013 2:22:56 PM<br>
	 * 作者: 孙耀飞<br>
	 * 模块: <br>
	 * 描述: <br>
	 * 1 <br>
	 * 2 <br>
	 */
	public User getUserByUserId(String userId);

	/**
	 * 取得给定部门的子部门
	 *
	 * @param depId
	 * @return
	 */
	public List<? extends Department> getChildrenOfDep(String depId);

	/**
	 * 计算子部门的个数
	 *
	 * @param depId
	 * @return
	 */
	public int countChildrenOfDep(String depId);

	/**
	 * 取得给定企业的所有部门数据，按层级返回
	 *
	 * @param comId
	 * @return
	 */
	public List<Department> getAllDepsAndUsers(String comId);

	/**
	 * 取得给定企业、给定级别的部门，level=0时取得根组织机构的根
	 *
	 * @param comId
	 * @param level
	 * @return
	 */
	public List<Department> getDeps(String comId, int level);

	/**
	 * 取得给定企业的所有角色数据,列表结构
	 *
	 * @param comId
	 * @return
	 */
	public List<Role> getAllRoles(String comId);

	/**
	 * @Description : 得到企业的所有角色数据，树结构
	 * @Method_Name : getTreeRoles
	 * @param comId
	 * @return
	 * @return : List<Role>
	 * @Creation Date : 2015年5月6日 上午10:10:55
	 * @version : v1.00
	 * @Author : calonlan
	 *
	 * @Update Date :
	 * @Update Author :
	 */
	public List<Role> getTreeRoles(String comId);

	public List<Option> getOptionsByDepartment(List<Department> deps);

	public List<Option> getOptionsByRoles(List<Role> roles);

	/**
	 *
	 * 建立日期 : Jul 21, 2013 12:16:54 PM<br>
	 * 作者: 孙耀飞<br>
	 * 模块: <br>
	 * 描述:根据公司Id找到下面所有的部门信息，不包括人员 <br>
	 * 1 <br>
	 * 2 <br>
	 */
	public List<Department> getDeps(String entId);

	/**
	 * 下级部门负责人
	 *
	 * @param userId
	 * @return
	 */
	public List<? extends User> getDownDepMgrs(String userId);

	/**
	 * 本部门其他人
	 *
	 * @param userId
	 * @return
	 */
	public List<? extends User> getOthersOfDep(String userId);

	/**
	 * 取得上级部门
	 *
	 * @param userId
	 * @param level
	 * @return
	 */
	public Department getUpDepByUser(String userId, String level);

	/**
	 * 取得下级部门所有人
	 *
	 * @param userId
	 * @return
	 */
	public List<? extends User> getDownDepsByUser(String userId);

	/**
	 * 取得上级部门
	 *
	 * @param userId
	 * @param level
	 * @return
	 */
	public Department getUpDepByDep(String depId, String level);

	/**
	 * 取得下级部门
	 *
	 * @param userId
	 * @return
	 */
	public List<? extends Department> getDownDepsByDep(String depId);

	/**
	 * 根据部门id得到其部门名及所有上级部门名
	 *
	 * @author 刘杰
	 * @date Jul 29, 2014 4:48:03 PM
	 * @param deptId
	 * @return
	 */
	public String getDeptNames(Long deptId);

	/**
	 * @Description : 根据部门id得到部门
	 * @Method_Name : getDeptById
	 * @param deptId
	 * @return
	 * @return : Department
	 * @Creation Date : 2015年5月28日 下午4:39:08
	 * @version : v1.00
	 * @Author : calonlan
	 *
	 * @Update Date :
	 * @Update Author :
	 */
	public Department getDeptById(String deptId);

	/**
	 *
	 * @author _zili
	 * @Description:通过字典code模糊匹配获取字典列表 _workflow
	 * @date 2015年5月28日 下午5:25:33
	 */
	public List<Dictionary> searchByCode(String dicCode);

	/**
	 *
	 * @author _zili
	 * @Description:通过字典Id获取字典值列表
	 * @date 2015年5月28日 下午5:28:12
	 */
	public List<DictionaryValue> findByDicnId(String dicnId);

	/**
	 *
	 * @author _zili
	 * @Description:通过id找字典
	 * @date 2015年5月29日 上午9:03:55
	 */
	public Dictionary findDictById(String dicnId);

	/**
	 *
	 * @author _zili
	 * @Description:通过id找字典值
	 * @date 2015年5月29日 上午9:04:07
	 */
	public DictionaryValue findDictValueById(String dicvId);

	public Company getCompById(String comId);
}
